{
 "cells": [
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T09:02:33.881145Z",
     "start_time": "2025-02-25T09:02:21.261577Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 2.2.1\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.1\n",
      "torch 2.6.0+cu126\n",
      "cuda:0\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "cell_type": "code",
   "source": [
    "28*28"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T09:02:35.942943Z",
     "start_time": "2025-02-25T09:02:35.939047Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "784"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 2
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T09:02:42.432907Z",
     "start_time": "2025-02-25T09:02:36.693712Z"
    }
   },
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "\n",
    "# 定义数据集的变换\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(), # 转换为tensor，进行归一化\n",
    "    # transforms.Normalize(mean, std) # 标准化，mean和std是数据集的均值和方差\n",
    "])\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_ds)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-24T14:30:08.573158Z",
     "start_time": "2025-02-24T14:30:08.569499Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torchvision.datasets.mnist.FashionMNIST"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "cell_type": "code",
   "source": [
    "len(train_ds)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-24T14:30:08.879953Z",
     "start_time": "2025-02-24T14:30:08.876680Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60000"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 5
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_ds[0])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-24T14:30:09.324250Z",
     "start_time": "2025-02-24T14:30:09.320084Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 6
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T09:02:46.118700Z",
     "start_time": "2025-02-25T09:02:46.101759Z"
    }
   },
   "source": [
    "img, label = train_ds[0]\n",
    "img.shape"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 28, 28])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T08:16:31.733705Z",
     "start_time": "2025-01-14T08:16:31.729732Z"
    }
   },
   "cell_type": "code",
   "source": "type(img) ",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PIL.Image.Image"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  },
  {
   "cell_type": "code",
   "source": "img[0]",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-14T08:13:38.479618Z",
     "start_time": "2025-01-14T08:13:38.475341Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510, 0.2863, 0.0000,\n",
       "         0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0039,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333, 0.4980, 0.2431,\n",
       "         0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118, 0.0157, 0.0000, 0.0000,\n",
       "         0.0118],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000, 0.6902, 0.5255,\n",
       "         0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000, 0.0000, 0.0471, 0.0392,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255, 0.8118, 0.6980,\n",
       "         0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902, 0.3020, 0.5098, 0.2824,\n",
       "         0.0588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745, 0.8549, 0.8471,\n",
       "         0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725, 0.5529, 0.3451, 0.6745,\n",
       "         0.2588],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098, 0.9137, 0.8980,\n",
       "         0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980, 0.4824, 0.7686, 0.8980,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471, 0.8745, 0.8941,\n",
       "         0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667, 0.8745, 0.9608, 0.6784,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549, 0.8353, 0.7765,\n",
       "         0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745, 0.8627, 0.9529, 0.7922,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314, 0.8549, 0.7529,\n",
       "         0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314, 0.8863, 0.7725, 0.8196,\n",
       "         0.2039],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627, 0.8549, 0.7961,\n",
       "         0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627, 0.9608, 0.4667, 0.6549,\n",
       "         0.2196],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020, 0.8941, 0.9412,\n",
       "         0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510, 0.8510, 0.8196, 0.3608,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745, 0.8706, 0.8588,\n",
       "         0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431, 0.8549, 1.0000, 0.3020,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667, 0.8549, 0.8157,\n",
       "         0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431, 0.8784, 0.9569, 0.6235,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196, 0.7412,\n",
       "         0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039, 0.8275, 0.9020,\n",
       "         0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725, 0.9137, 0.9333, 0.8431,\n",
       "         0.0000],\n",
       "        [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157, 0.8000,\n",
       "         0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569, 0.8078, 0.8745,\n",
       "         1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275, 0.8627, 0.9098, 0.9647,\n",
       "         0.0000],\n",
       "        [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392, 0.8039,\n",
       "         0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000, 0.8980, 0.8667,\n",
       "         0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196, 0.8706, 0.8941, 0.8824,\n",
       "         0.0000],\n",
       "        [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176, 0.9765,\n",
       "         0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863, 0.4157, 0.4588,\n",
       "         0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745, 0.8745, 0.8784, 0.8980,\n",
       "         0.1137],\n",
       "        [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824, 0.8471,\n",
       "         0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647, 0.8902, 0.9608,\n",
       "         0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706, 0.8627, 0.8667, 0.9020,\n",
       "         0.2627],\n",
       "        [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451, 0.7608,\n",
       "         0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255, 0.8824, 0.8471,\n",
       "         0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745, 0.7098, 0.8039, 0.8078,\n",
       "         0.4510],\n",
       "        [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686, 0.8000,\n",
       "         0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686, 0.7608, 0.7490,\n",
       "         0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118, 0.6549, 0.6941, 0.8235,\n",
       "         0.3608],\n",
       "        [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745, 0.6863,\n",
       "         0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765, 0.8000, 0.8196,\n",
       "         0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608, 0.7529, 0.8471, 0.6667,\n",
       "         0.0000],\n",
       "        [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294, 0.9373,\n",
       "         0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569, 0.7490, 0.7020,\n",
       "         0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588, 0.3882, 0.2275, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569, 0.2392,\n",
       "         0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000],\n",
       "        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "         0.0000]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T08:16:50.708516Z",
     "start_time": "2025-01-14T08:16:50.682030Z"
    }
   },
   "cell_type": "code",
   "source": "img",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<PIL.Image.Image image mode=L size=28x28>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACS0lEQVR4AWKgA2BkYOD1ZGBgZAHZxcjIAKZBbBBm+quS8v3rj1N/GBiZGP8wMKNIMv91cnnCzuU65+X/vww8/76hSP5iMFVgZtpp2HXm8nUz02PHGUHGQTHjf9cugd//GE7f+cUo8ft0yDSEJCMDw/8TCgyMf34x/Ph3/vYfT0VphLH/GRgY3kt+Z2fl+cH5z8aSSWwHqmsZuJiZvn18p/CPkYnr7z9ZBiaofQwMjMwMPFI/frH++sr/j537K9sldhOE5H9mhnBJJg4Gbtlf7L//cQhvusaCkGT5xXDlBxsXl6rSD2Yunr9PoraeYAGZx8T4+x/DHwaGbV+/s/1/zczxm+H3P2a9jwxMDMz///z6+Y+BwW7ime9v//z78/XrXw6GbwxsX4NAYc3AICSlJhmk/oPpN+czVjbhX1zHeOz+fWR9qcnIYNkkKvCX+cMfrl+M36+HneEVVGC4x/v5GycPHxcj83GpP3+/MTB/Z2DgF0lwy3z24/49VeFfrLxsf+UBY0xqv8vDw87Ayv/4mSiTRACHIrexMdMvJjYGRlYLlpeP+X485mHje/eQ5/uPP+svKwj9+vD77y/Wf4xsaixP/z/mFvnw5jULOysHL9Mbza+P37O/+f3nN6fERwOWC+sTn937wcPGwcb88+//by/+/WX5wfPrw4fffxRfMjIweBWLv/7wl5mNhZnxPysrGysjA+NLBrZ/EpfCGJn+MTA4tYnxMzGz/GV8+f/pvy/MDP9/f2Paff0YJBAYGBg0RN/LPPx1Fx5HFDIAaCTYdiCc4RIAAAAASUVORK5CYII=",
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAcABwBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+tbw1oNx4m8QWmkWx2yXD4LkZCADJJ+gFbviL4a63oc7COE3MW4hdn38duD976jNc9daDqllIsc9lKrMu4YGeMkdR7gj8KzcV7H8BtEvV16+1iWCeG1Wz8mOV02pIzupwCeuAp6Z98cZ90aIzLIlw0c0ZJ4KgjHoeOa+evjS9n/wnMcNxBPCYLKONFhA2FNzMpGenDcgd816V4K03wefC+m3NlpVhP+5QSXBiR5fMx825iMg5zwce3FdbOzTwgW90lu6uCm8eYrL02soIyCPQgggEdMGQ3cluiPNK0rJwrRQBNueuMkt+teNfGKxsdY8WWdxNqcNo66eieXMwVsb5DnH415Hp2rajpE5n02/urOUjBe3laMkehIPIrVm8eeLrhNknibVivoLtx/I1UPinxC3XXtUP1vJP8ay5JZJpGkldnduSzHJP41//2Q=="
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "cell_type": "code",
   "source": [
    "def cal_mean_std(ds):\n",
    "    mean = 0.\n",
    "    std = 0.\n",
    "    for img, _ in ds: # 遍历每张图片,img.shape=[1,28,28]\n",
    "        mean += img.mean(dim=(1, 2))\n",
    "        std += img.std(dim=(1, 2))\n",
    "    mean /= len(ds)\n",
    "    std /= len(ds)\n",
    "    return mean, std\n",
    "\n",
    "\n",
    "print(cal_mean_std(train_ds))\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T09:02:57.353274Z",
     "start_time": "2025-02-25T09:02:51.235614Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([0.2860]), tensor([0.3205]))\n"
     ]
    }
   ],
   "execution_count": 5
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "data": {
      "text/plain": "torch.Tensor"
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:33.598821200Z",
     "start_time": "2024-07-17T03:06:33.540172Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "data": {
      "text/plain": "9"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:33.599820400Z",
     "start_time": "2024-07-17T03:06:33.545914600Z"
    }
   }
  },
  {
   "cell_type": "code",
   "source": [
    "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
    "def show_img_content(img):\n",
    "    from PIL import Image\n",
    "\n",
    "    # 打开一个图像文件\n",
    "    # img = Image.open(img)\n",
    "\n",
    "\n",
    "    print(\"图像大小:\", img.size)\n",
    "    print(\"图像模式:\", img.mode)\n",
    "\n",
    "\n",
    "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
    "    if img.mode == 'L':\n",
    "        pixel_values = list(img.getdata())\n",
    "        print(pixel_values)\n",
    "show_img_content(img) #这里必须把上面的 transforms.ToTensor(), # 转换为tensor，进行归一化注释掉，否则是不行的"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T09:02:58.643539Z",
     "start_time": "2025-02-25T09:02:58.639531Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "图像大小: <built-in method size of Tensor object at 0x00000200122857C0>\n",
      "图像模式: <built-in method mode of Tensor object at 0x00000200122857C0>\n"
     ]
    }
   ],
   "execution_count": 6
  },
  {
   "cell_type": "code",
   "source": [
    "#这个代码必须是注释了上面的 transforms.ToTensor()才能够运行的\n",
    "def show_single_image(img_arr):\n",
    "    plt.imshow(img_arr, cmap=\"binary\") # 显示图片\n",
    "    plt.colorbar() # 显示颜色条\n",
    "    plt.show()\n",
    "\n",
    "show_single_image(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-14T08:19:34.826746Z",
     "start_time": "2025-01-14T08:19:34.771801Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 20
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T09:03:04.204451Z",
     "start_time": "2025-02-25T09:03:03.902997Z"
    }
   },
   "source": [
    "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
    "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数\n",
    "    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))  #宽1.4高1.6，宽，高\n",
    "    for row in range(n_rows):\n",
    "        for col in range(n_cols):\n",
    "            index = n_cols * row + col  # 计算索引，从0开始\n",
    "            plt.subplot(n_rows, n_cols, index+1)#因为从1开始\n",
    "            img_arr, label = train_ds[index]\n",
    "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维\n",
    "            plt.imshow(img_arr, cmap=\"binary\",\n",
    "                       interpolation = 'nearest')#interpolation='nearest'是临近插值\n",
    "            plt.axis('off')#去除坐标系\n",
    "            plt.title(class_names[label]) # 显示类别名称\n",
    "    plt.show()\n",
    "    \n",
    "    \n",
    "\n",
    "#已知的图片类别\n",
    "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
    "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
    "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
    "               'Bag', 'Ankle boot'] #0-9分别代表的类别\n",
    "#只是打印了前15个样本\n",
    "show_imgs(3, 5, train_ds, class_names)\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 700x480 with 15 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGMCAYAAADA5EjBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAb4tJREFUeJztnQe41FS3hoPSe++9SRekIwqCiDQFRRFFQBRRUcGG/Cr2hogoImDFgvyi0hEFFJCuFKnSm/TeBFGQuc/KvZP7ZZ3sMOdwymTme5/nwJ7Jnkxmt+ysmi4UCoUsQgghhJAAcklaXwAhhBBCSFLhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGDhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGCJqo1M9+7drezZs1+wXtOmTe2/5ELOVa1atWQ7H0ketm/fbqVLl8568803L1j3+eeft+uS6IH9R0jasj1O5uBFb2SGDx9u//j69esnzxXFGa+++qo1ceJEK4hIv0fyN2fOHCuaOH36tD1po+26Uhv2X+zx6aefuvouc+bMVtGiRa2WLVtaQ4cOtU6ePJnWl0gAzsHkIf3FnuDLL7+0Spcubf3666/W5s2brfLlyyfPlcXRRqZjx45W+/btraDxxRdfuF5//vnn1syZMxO8X7ly5RS/lmeeecbq379/xJPwhRdesMvJKdkLGuy/2OXFF1+0ypQpY509e9bat2+ffcPp27ev9dZbb1mTJ0+2atSokdaXSDgHo2Mjs23bNmvhwoXW+PHjrV69etmbmueeey75ro5ENV26dHG9Xrx4sT0J9fupQfr06e0/P86fP2/9888/qXZN0Q77L3Zp1aqVVadOHef1f/7zH2vWrFlW27ZtrRtuuMFat26dlSVLFs/Pnjp1ysqWLVsqXm38wjkYBaol2bjkyZPHatOmjS1VkNd+OroPPvjAKleunJUpUyarbt261pIlSy74HStWrLAKFChg7/r+/PNPY72///7b3kSJREjOX6JECatfv372+5GybNkyq1GjRvYEl6eZkSNHJqhz4MAB6+6777YKFSpki20vv/xy67PPPvNcDB577DH7OuR6LrvsMrsNMNm4tIvUk8+HRYhiJxQvLF261BZ558+f32nzHj16eNa90Njx0u/K6wcffNAel1WrVrU/K30q40mQJ4pwu8vnSeJg/wWLZs2aWQMGDLB27NhhjR492mWXuGXLFqt169ZWjhw5rDvuuMO5ab399tt228taJ2uePLAePXo00ePgq6++smrXrm2fP2fOnFb16tWtd955JxV/fWzCOZgMEhn5cTfddJOVMWNGq3PnztaIESPsxpFG0owZM8bWz8pEkB/9xhtv2J/dunWrlSFDBs/zy7mkk+TJYtKkScYnCJlw8pQxf/58695777XFcKtXr7aGDBlibdy4MSIbFJmcMpFvvfVW+7d8/fXX1v3332//tvDA+Ouvv+wNlajQpHNl0HzzzTf2YnDs2DGrT58+dj3ZrMj1zJ4929701KxZ05o+fbr1xBNPWLt377avSxDx4T333GPVq1fPvm5BBlo8IBvC6667zp4QIs7MnTu3vekV6V5yjJ0w8hQqfSn9JZNdNp4yTqVvO3ToYJ9HoKg9cbD/gsmdd95pPfXUU9aMGTOsnj172u+dO3fOXmcbN25sP2xlzZrVfl/6S2xu7rrrLuvhhx+2JfDDhg2zfvvtN2vBggV230UyDkTCIGtq8+bNrYEDB9rviURIzhFeM0ni4RwEQklk6dKlIloIzZw50359/vz5UPHixUN9+vRx1du2bZtdL1++fKEjR44470+aNMl+f8qUKc573bp1C2XLls0uz58/P5QzZ85QmzZtQmfOnHGds0mTJvZfmC+++CJ0ySWXhObNm+eqN3LkSPs7FixY4Ptb5FxSb/Dgwc57f//9d6hmzZqhggULhv755x/7vbffftuuN3r0aKeeHGvYsGEoe/bsoRMnTtjvTZw40a738ssvu76nY8eOoXTp0oU2b97svCe/V353LNC7d2/7d0fChAkT7LpLliwx1knM2HnuuecSfLe8lnGxdu1a1/sHDx60j8lnyP/D/gs+o0aNumC/5MqVK1SrVi27LGuP1O/fv7+rjqyl8v6XX37pev+HH35wvR/JOJB7gqzl586du8hfF/twDiaNSy5GGiOixmuuucZ+Lbu8Tp062SLEf//9N0F9OSZqqDBXXXWV/b/sCDUiyZAnBNnBy+5SxFl+iFREpDCVKlWyDh065PyJKDV8vgshukHZrYYRSYy8ll2vqJyEadOmWYULF7afLsLIblaeVkTt9fPPPzv1Lr30Uvt9RFRNMja+//57K96Rpwdh6tSptkGiH4kZO5omTZpYVapU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YOFGhhBCCCGBhRsZQgghhASWmN7IbN++3UqXLp315ptvXrDu888/b9clF0f37t2t7NmzX7Be06ZN7b/kQs5VrVq1ZDsfSV0+/fRTe/7JnE3KmCtdunSKXBeJDPZffNwno5U03chI40XyN2fOHCuaOH36tL3xibbrSirDhw+327l+/fppfSmB5NVXX7UmTpxoBY3Vq1dbHTt2tEqVKmVlzpzZKlasmNWiRQvr3XffTetLIxHA/gsO7KuUJb2VhnzxxReu159//rk1c+bMBO9Xrlw5xa/lmWeesfr37x/xRuaFF16wy8kpVUgrvvzyS/uJ6Ndff7U2b95slS9fPq0vKXAbGVmk2rdvbwWFhQsXWtdcc41VsmRJq2fPnlbhwoWtnTt3WosXL7beeecd66GHHkrrSyQ+sP+CA/sqxjcyXbp0cb2WjpWNjH4/NUifPr3958f58+etf/75x4oltm3bZk+08ePHW7169bI3Nc8991xaXxZJYV555RUrV65c1pIlS6zcuXO7jh04cCDNrotEBvsvOLCvLPvhP2vWrCl2/kDbyCxdutRq2bKllT9/fitLlixWmTJlrB49enjW/eCDD6xy5cpZmTJlsurWrWsPqgvZyMjrBx980L65V61a1f7syJEjrQIFCtjHRSoTVn/J54OI/LY8efJYbdq0saUK8tpPh3qhdvRixYoVdpuJ9OrPP/801vv777/tTZRIhOT8JUqUsPr162e/HynLli2zGjVq5IwH6S+NLB533323VahQIVvMe/nll1ufffZZgnqnTp2yHnvsMfs65Houu+wyuw1CoZBTR9pF6snnw2NBdP7RzpYtW+wxrRdWoWDBgk551KhRVrNmzez3pA2qVKlijRgxIsFnRKLXtm1ba/78+Va9evXsdi1btqwtZdWsXbvWPqf0UfHixa2XX37ZfkjQTJo0yR6XRYsWtb9bxt1LL71k/fvvv1a8w/6Lvb4K329ETS32ftJm8rkffvghwed2795t3+tkDcv0f/U++eQTVx156H722Wet2rVr2xupbNmyWVdddZU1e/bsC16zrHH33nuvlTFjRvshN8zo0aPt80nf582b17rtttts6ZKXvaKsxVdffbW9gXnqqaesmJXIXAxyM7ruuuvsG6SohGSQyA0XGz3MmDFjrJMnT9oSBxksb7zxhnXTTTdZW7dutTJkyOD7PbNm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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 7
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T09:03:07.788836Z",
     "start_time": "2025-02-25T09:03:07.785100Z"
    }
   },
   "source": [
    "# 从数据集到dataloader\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True) #batch_size分批，shuffle洗牌\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ],
   "outputs": [],
   "execution_count": 8
  },
  {
   "cell_type": "markdown",
   "source": [
    "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
    "\n",
    "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
    "\n",
    "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
    "\n",
    "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。\n",
    "\n",
    "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
    "\n",
    "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
    "\n",
    "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-24T15:51:24.112128Z",
     "start_time": "2025-02-24T15:51:24.087378Z"
    }
   },
   "cell_type": "code",
   "source": [
    "for datas, labels in train_loader:\n",
    "    print(datas.shape)\n",
    "    print(labels.shape)\n",
    "    break\n",
    "for datas, labels in val_loader:\n",
    "    print(datas.shape)\n",
    "    print(labels.shape)\n",
    "    break"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n"
     ]
    }
   ],
   "execution_count": 15
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T09:03:13.702513Z",
     "start_time": "2025-02-25T09:03:13.696484Z"
    }
   },
   "source": [
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__() # 继承父类的初始化方法，子类有父类的属性\n",
    "        self.flatten = nn.Flatten()  # 展平层\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(784, 300),  # in_features=784, out_features=300, 784是输入特征数，300是输出特征数\n",
    "            nn.ReLU(), # 激活函数\n",
    "            nn.Linear(300, 100),#隐藏层神经元数100\n",
    "            nn.ReLU(), # 激活函数\n",
    "            nn.Linear(100, 10),#输出层神经元数10\n",
    "        )\n",
    "\n",
    "    def forward(self, x): # 前向计算\n",
    "        # x.shape [batch size, 1, 28, 28]\n",
    "        x = self.flatten(x)  \n",
    "        # 展平后 x.shape [batch size, 784]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits #没有经过softmax,称为logits\n",
    "    \n",
    "model = NeuralNetwork()"
   ],
   "outputs": [],
   "execution_count": 9
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-24T15:49:34.585710Z",
     "start_time": "2025-02-24T15:49:34.579688Z"
    }
   },
   "source": [
    "# 看看网络结构\n",
    "model"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NeuralNetwork(\n",
       "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
       "  (linear_relu_stack): Sequential(\n",
       "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
       "    (3): ReLU()\n",
       "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 12
  },
  {
   "cell_type": "code",
   "source": [
    "784*300+300+300*100+100+100*10+10"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-24T15:49:39.793760Z",
     "start_time": "2025-02-24T15:49:39.789085Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "266610"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 13
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-24T15:49:42.655566Z",
     "start_time": "2025-02-24T15:49:42.650949Z"
    }
   },
   "source": [
    "for name, param in model.named_parameters(): # 打印模型参数\n",
    "      print(name, param.shape)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear_relu_stack.0.weight torch.Size([300, 784])\n",
      "linear_relu_stack.0.bias torch.Size([300])\n",
      "linear_relu_stack.2.weight torch.Size([100, 300])\n",
      "linear_relu_stack.2.bias torch.Size([100])\n",
      "linear_relu_stack.4.weight torch.Size([10, 100])\n",
      "linear_relu_stack.4.bias torch.Size([10])\n"
     ]
    }
   ],
   "execution_count": 14
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-24T17:12:05.326727Z",
     "start_time": "2025-02-24T17:12:05.313658Z"
    }
   },
   "source": [
    "# 看看模型参数\n",
    "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,requires_grad=True\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Parameter containing:\n",
       " tensor([[-0.0339,  0.0243,  0.0070,  ...,  0.0004,  0.0017,  0.0348],\n",
       "         [ 0.0309, -0.0148, -0.0337,  ...,  0.0292, -0.0323,  0.0334],\n",
       "         [ 0.0122, -0.0202,  0.0201,  ...,  0.0007,  0.0175, -0.0196],\n",
       "         ...,\n",
       "         [-0.0086, -0.0126,  0.0297,  ..., -0.0052,  0.0231,  0.0284],\n",
       "         [-0.0220,  0.0159,  0.0293,  ..., -0.0160,  0.0123,  0.0110],\n",
       "         [-0.0291, -0.0230,  0.0270,  ..., -0.0306, -0.0238, -0.0224]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-2.4578e-02, -8.2097e-03,  4.2780e-03,  3.3143e-02,  2.7637e-02,\n",
       "          7.1542e-03,  2.6394e-02, -1.7590e-04, -2.4561e-02,  2.6410e-02,\n",
       "          1.9416e-02,  2.3640e-02,  1.9229e-02,  1.9717e-02, -1.3108e-02,\n",
       "         -8.8650e-03, -8.6766e-04,  1.0585e-02, -2.3185e-02,  1.1091e-02,\n",
       "         -3.1335e-03,  3.5021e-02,  3.2529e-02,  1.1041e-02, -1.9605e-02,\n",
       "          9.8597e-03, -1.8713e-02,  1.9502e-02,  1.1049e-02,  1.4749e-02,\n",
       "          4.7651e-04, -1.0188e-02,  2.5588e-02,  2.8799e-02, -2.4120e-02,\n",
       "          1.4698e-02, -2.0351e-02,  3.4374e-02,  1.9440e-02,  8.3249e-03,\n",
       "         -2.8416e-02, -1.8060e-03, -2.3538e-04,  3.0961e-03, -3.5435e-05,\n",
       "          1.7653e-02,  2.4378e-03, -2.6965e-02, -2.4001e-02,  1.5908e-02,\n",
       "         -2.6691e-02, -3.0527e-02, -1.0623e-02,  1.0778e-02, -3.1465e-02,\n",
       "         -1.6598e-03,  2.3668e-02,  3.0173e-02, -3.3395e-02, -2.7544e-02,\n",
       "         -1.5464e-02,  2.6074e-02,  1.5331e-02,  8.2938e-03, -1.4054e-02,\n",
       "         -5.2853e-03, -3.3412e-02,  4.0710e-03,  3.3720e-02, -7.7369e-03,\n",
       "         -1.6674e-02, -3.3625e-02, -8.5855e-03,  2.6146e-02, -2.4026e-02,\n",
       "         -2.9512e-02, -1.1035e-02,  1.2292e-02,  3.2628e-02,  1.7416e-02,\n",
       "         -1.2377e-02, -8.9827e-04, -3.1293e-02,  3.1205e-02, -1.9949e-02,\n",
       "         -8.8059e-03,  5.6990e-03, -3.0189e-02,  1.8224e-02, -3.4577e-02,\n",
       "         -3.7942e-03, -1.9660e-04,  3.7517e-03, -1.1393e-02, -3.5251e-02,\n",
       "          7.9960e-04, -1.8519e-02,  1.0235e-02,  1.4579e-02, -1.6783e-02,\n",
       "          9.1445e-03, -3.3726e-02,  1.3275e-02,  2.4628e-03,  1.3106e-02,\n",
       "          7.7665e-03,  2.3668e-02,  2.1484e-02, -6.1297e-03, -2.2197e-02,\n",
       "          9.1496e-03, -4.4644e-03,  3.5587e-02, -1.3785e-03, -3.2821e-03,\n",
       "          2.7543e-02,  9.5715e-03, -1.4937e-02,  1.6471e-02,  1.6963e-02,\n",
       "         -3.5023e-02, -7.4532e-03, -3.7901e-04, -2.0738e-02, -3.9052e-04,\n",
       "          1.4560e-02,  7.7955e-03,  4.5982e-03,  3.5510e-03,  2.4473e-03,\n",
       "         -2.6295e-02,  5.1643e-04, -3.5086e-02,  2.4898e-03,  3.4132e-02,\n",
       "          3.4172e-02, -6.4779e-03, -1.2260e-02, -1.6664e-02,  1.9030e-02,\n",
       "          1.9592e-02, -1.1448e-02, -2.4054e-02, -3.2465e-02,  3.4222e-02,\n",
       "         -5.8206e-03,  3.5261e-02, -2.4503e-02,  4.2823e-03, -2.2453e-02,\n",
       "          2.3694e-02, -7.9681e-03, -1.9233e-02, -2.9593e-02,  1.7834e-02,\n",
       "          1.4199e-02, -2.4174e-02, -1.5212e-03,  3.2107e-02, -2.7585e-02,\n",
       "          3.1886e-02,  1.1144e-02,  3.3484e-02,  3.3720e-02,  1.4404e-02,\n",
       "          1.2371e-02, -8.7448e-03, -2.9370e-02, -1.9249e-05, -1.4041e-02,\n",
       "          2.9549e-03, -3.8716e-03,  2.6665e-02,  1.0650e-02,  1.7272e-02,\n",
       "          1.1472e-02,  2.1327e-02, -2.5336e-03,  1.5855e-02, -1.1187e-02,\n",
       "         -2.4780e-02,  3.3803e-02, -3.0342e-02,  8.3960e-03, -3.1931e-02,\n",
       "         -1.7815e-02,  1.5057e-02,  1.2905e-02,  3.7650e-03,  3.3731e-02,\n",
       "         -1.0099e-03, -6.4876e-04,  2.3523e-02, -1.4752e-02,  3.4912e-02,\n",
       "         -6.7022e-03, -1.0341e-03, -1.3028e-02,  3.1628e-02, -6.5688e-03,\n",
       "          1.2426e-02,  2.2291e-02,  1.0597e-02,  5.8486e-03, -2.5969e-02,\n",
       "         -1.0907e-02, -4.3364e-03,  2.3066e-02,  3.3389e-02,  3.3248e-03,\n",
       "         -3.4378e-02, -2.0825e-02,  2.5798e-02,  1.7044e-03, -2.9154e-02,\n",
       "          2.7162e-02, -1.6318e-02,  3.0882e-02, -2.9995e-02,  1.2576e-03,\n",
       "         -8.1243e-03,  4.9092e-03, -1.8949e-02, -1.3352e-02,  1.8539e-03,\n",
       "         -5.4482e-03,  9.3877e-03,  3.5483e-02, -2.5375e-02, -2.8806e-02,\n",
       "          9.2483e-03,  1.6081e-02, -1.5776e-02, -2.9735e-02, -2.0188e-04,\n",
       "          3.0920e-02,  2.9104e-02, -2.0737e-03, -2.1351e-02, -6.1153e-03,\n",
       "          1.7212e-02, -1.4251e-02, -1.1715e-02,  3.5083e-02, -8.7796e-03,\n",
       "          2.3471e-02,  2.8232e-03,  3.3176e-02,  2.3598e-02, -3.5205e-02,\n",
       "          2.5536e-02,  1.1760e-02, -3.3386e-02,  2.5004e-02,  2.2387e-03,\n",
       "          2.0936e-02,  2.5570e-02,  2.9889e-03, -3.2500e-02,  1.5004e-02,\n",
       "         -2.6748e-02, -2.4310e-02,  2.5164e-02,  5.3969e-03,  5.4067e-03,\n",
       "         -2.5572e-02, -1.7088e-02,  2.8564e-02,  2.5895e-02,  1.9851e-02,\n",
       "         -9.4763e-04, -1.5801e-02,  2.4150e-02, -3.3847e-02, -2.1015e-02,\n",
       "         -2.0373e-02, -1.3410e-02,  2.9185e-02,  1.3009e-02, -2.2921e-02,\n",
       "          8.1423e-03,  2.8805e-02, -1.7145e-02, -1.2167e-02, -3.1857e-02,\n",
       "         -5.6674e-03, -2.0298e-02,  1.1632e-02,  3.4238e-02, -4.3017e-03,\n",
       "          1.4365e-02,  1.9987e-02,  1.8010e-02, -8.7402e-03, -3.4868e-02,\n",
       "         -8.0796e-03,  2.2381e-02, -1.2287e-04,  1.8780e-02, -2.8529e-02],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 0.0210,  0.0043,  0.0039,  ...,  0.0127, -0.0382, -0.0309],\n",
       "         [ 0.0501,  0.0231,  0.0231,  ...,  0.0273, -0.0353, -0.0058],\n",
       "         [ 0.0148,  0.0540,  0.0260,  ...,  0.0036, -0.0566,  0.0327],\n",
       "         ...,\n",
       "         [ 0.0299,  0.0240,  0.0396,  ..., -0.0193, -0.0512,  0.0057],\n",
       "         [-0.0084,  0.0181, -0.0387,  ..., -0.0179, -0.0128, -0.0279],\n",
       "         [-0.0377, -0.0148,  0.0225,  ...,  0.0547,  0.0257,  0.0004]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([ 0.0188, -0.0482,  0.0318,  0.0058,  0.0208, -0.0448, -0.0430, -0.0198,\n",
       "         -0.0192,  0.0119,  0.0406, -0.0431, -0.0361, -0.0021, -0.0083,  0.0369,\n",
       "          0.0303, -0.0299, -0.0566, -0.0025,  0.0389,  0.0121,  0.0084, -0.0534,\n",
       "          0.0449,  0.0468,  0.0055,  0.0262,  0.0442, -0.0248, -0.0405,  0.0412,\n",
       "         -0.0255,  0.0558, -0.0274,  0.0025,  0.0315,  0.0261, -0.0015,  0.0442,\n",
       "          0.0251,  0.0192,  0.0353, -0.0218,  0.0397, -0.0573,  0.0168, -0.0079,\n",
       "         -0.0525, -0.0484,  0.0245,  0.0007, -0.0094,  0.0331, -0.0033,  0.0410,\n",
       "         -0.0208, -0.0232, -0.0207,  0.0294, -0.0523, -0.0068, -0.0032,  0.0107,\n",
       "          0.0204, -0.0015,  0.0087,  0.0182,  0.0320, -0.0104, -0.0084,  0.0211,\n",
       "         -0.0234,  0.0306, -0.0291,  0.0323,  0.0314,  0.0142, -0.0521,  0.0467,\n",
       "         -0.0237,  0.0383,  0.0399, -0.0480,  0.0139, -0.0434,  0.0048, -0.0433,\n",
       "          0.0550, -0.0031, -0.0347, -0.0574, -0.0460, -0.0127,  0.0428,  0.0138,\n",
       "         -0.0575, -0.0450, -0.0140,  0.0534], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 7.2170e-02, -1.8428e-02, -3.7668e-02,  3.6962e-02,  5.8110e-02,\n",
       "          -6.5967e-02,  4.4494e-02,  1.0862e-02, -3.2919e-02,  9.6222e-02,\n",
       "           3.2991e-02,  5.2022e-02,  5.3152e-03, -2.1377e-02, -5.7678e-02,\n",
       "           8.8233e-03,  9.3797e-02,  8.2660e-03, -9.1183e-02,  6.9605e-02,\n",
       "          -5.8428e-02,  8.2657e-02, -4.3472e-02,  3.9496e-02,  3.1588e-03,\n",
       "          -6.9975e-02, -2.1752e-02, -2.5757e-02,  4.5530e-03, -3.2242e-02,\n",
       "           2.1059e-02, -1.6002e-02,  5.4073e-02, -2.4123e-02,  5.2068e-02,\n",
       "           5.5706e-02, -1.1864e-02, -3.8334e-02, -1.7392e-02, -4.0602e-02,\n",
       "          -3.6877e-02,  6.7080e-03, -7.0562e-02,  9.5141e-02, -2.2131e-02,\n",
       "           6.2588e-02, -6.1962e-03, -1.8293e-02,  3.2255e-02, -5.0736e-02,\n",
       "          -5.1741e-02,  2.6605e-02,  2.4200e-02, -5.8612e-02,  8.4138e-02,\n",
       "          -3.1434e-02,  7.2903e-03,  9.5940e-02, -9.0158e-02,  1.2140e-02,\n",
       "          -7.9174e-02,  7.3647e-02,  3.3678e-02, -2.5782e-02, -2.2772e-02,\n",
       "           5.8645e-02,  3.6563e-02, -8.5672e-02,  2.2006e-02,  5.7384e-02,\n",
       "          -1.4743e-02, -7.3666e-02, -7.0469e-02,  2.0786e-02,  7.3980e-02,\n",
       "           2.4718e-04, -1.5546e-02,  9.2161e-02,  2.4523e-02, -1.9462e-02,\n",
       "           7.9045e-02,  5.2235e-02,  7.0804e-02,  6.5393e-02,  3.7078e-02,\n",
       "           2.2090e-02,  8.0704e-02,  5.6057e-02,  6.6414e-02,  3.7209e-02,\n",
       "           1.2631e-03,  5.9238e-02,  5.5389e-02,  4.5939e-02, -5.3627e-02,\n",
       "          -7.2041e-02, -7.6457e-02, -8.5462e-03,  6.1324e-02, -7.1117e-02],\n",
       "         [-6.4154e-02,  2.5930e-02, -4.2918e-02,  4.6458e-02, -6.1730e-03,\n",
       "          -3.8545e-02,  2.0598e-02, -1.8066e-02, -6.2050e-02,  9.1411e-02,\n",
       "           1.2829e-02, -2.8387e-03, -5.0385e-02, -4.2507e-02, -8.4142e-02,\n",
       "           4.8404e-02,  4.3545e-02,  1.6735e-02,  7.7405e-02, -3.8882e-02,\n",
       "          -2.0979e-02,  7.3118e-02,  2.9403e-02,  5.3913e-02, -9.8196e-02,\n",
       "           5.6517e-02, -5.6958e-02,  8.7903e-02,  1.6045e-02,  6.5585e-02,\n",
       "           8.7984e-02, -9.5340e-02,  6.0695e-02,  6.5134e-02, -3.2776e-02,\n",
       "           6.4024e-02, -2.8546e-02,  4.9446e-02,  4.5142e-02, -6.9011e-02,\n",
       "           8.8484e-02,  6.6026e-02, -5.0008e-02,  2.4405e-02, -9.0624e-03,\n",
       "           4.0290e-02, -2.3342e-02,  2.4575e-02,  2.3089e-02,  3.3230e-02,\n",
       "          -3.2794e-02,  3.0637e-03, -6.1793e-02, -9.9097e-02, -6.8333e-02,\n",
       "          -9.8817e-02, -5.1968e-02,  6.7453e-02, -2.7139e-02, -8.4438e-02,\n",
       "           4.8731e-02, -6.1552e-03, -8.0431e-02, -1.6135e-02,  5.1011e-03,\n",
       "          -9.2978e-02, -1.6181e-03, -6.9577e-02,  9.5834e-02, -1.7953e-02,\n",
       "          -4.2068e-02,  8.0198e-02, -6.4379e-02, -2.5213e-04, -1.4894e-02,\n",
       "          -3.3723e-02,  3.1199e-02,  7.6004e-02, -7.4601e-02, -3.4397e-02,\n",
       "           3.1090e-02,  8.1083e-02, -2.6715e-02,  7.4805e-02,  2.7883e-02,\n",
       "           3.4912e-02, -1.6079e-02, -2.9432e-02, -7.8386e-02, -9.6609e-02,\n",
       "          -6.6287e-02,  5.2255e-02, -2.5181e-02,  9.1342e-02,  6.1542e-02,\n",
       "           6.8389e-02,  3.7302e-02, -7.4601e-02, -9.9704e-02,  9.6839e-03],\n",
       "         [ 7.4552e-03, -2.7578e-02,  3.4373e-03, -6.4594e-02,  7.6586e-02,\n",
       "           4.2122e-02,  4.7550e-02, -4.6967e-02, -8.9032e-03,  9.4046e-02,\n",
       "          -3.7564e-02, -6.7776e-02, -6.5790e-02, -3.4970e-02, -4.9392e-02,\n",
       "          -9.6521e-02, -8.1830e-02, -7.2423e-02,  4.5147e-03,  9.5692e-02,\n",
       "          -2.9779e-02,  9.8781e-02, -5.1002e-03,  7.5929e-02,  9.1860e-02,\n",
       "           9.1397e-03, -6.2388e-02,  9.7076e-02,  9.6532e-02,  8.8673e-02,\n",
       "           8.3414e-02,  4.1304e-02, -4.4987e-02,  1.3493e-02,  9.7964e-03,\n",
       "          -4.5516e-02, -9.3700e-02,  6.5167e-02,  7.8596e-02,  2.6795e-02,\n",
       "          -2.7120e-02, -4.5374e-02, -6.8421e-02, -7.1634e-03,  1.8373e-02,\n",
       "           8.0732e-02,  4.6010e-02, -9.0463e-03, -6.6620e-02,  8.2733e-02,\n",
       "          -2.1704e-02,  7.2753e-03,  3.3380e-03, -8.0731e-02, -1.2953e-02,\n",
       "          -3.7813e-03,  6.8087e-02,  5.8840e-03, -6.2117e-02,  3.1228e-02,\n",
       "           7.3261e-02,  9.1793e-03, -5.8575e-02, -9.1083e-02, -6.1353e-03,\n",
       "           1.7938e-02, -5.1810e-02,  2.4466e-02,  7.3891e-02,  8.6424e-02,\n",
       "          -8.9958e-02, -6.8809e-03, -9.1428e-02, -8.8282e-02, -7.7162e-02,\n",
       "           1.9730e-02, -2.9259e-02,  9.5345e-02,  7.9226e-03, -7.1816e-02,\n",
       "          -6.7228e-02, -2.4664e-02, -9.9808e-02,  1.4040e-02,  7.1577e-02,\n",
       "           7.0804e-02, -8.6271e-03,  9.8604e-02,  9.0000e-02,  2.4247e-02,\n",
       "           9.9651e-02, -6.4613e-02, -1.3630e-02,  6.4525e-02,  6.5672e-02,\n",
       "          -4.9942e-02, -7.6181e-02,  7.7779e-02, -4.1607e-02, -3.6855e-02],\n",
       "         [ 9.3132e-03, -3.2093e-02,  2.9039e-02, -7.5695e-02, -2.5152e-02,\n",
       "           5.8172e-02,  4.9915e-02, -7.4709e-02, -2.7174e-02,  6.1043e-02,\n",
       "           3.2172e-02, -7.3514e-02,  3.1061e-02, -2.0751e-03,  4.4888e-02,\n",
       "          -9.1142e-02,  3.6679e-02, -1.6155e-02,  9.2990e-02, -5.7916e-02,\n",
       "           9.8696e-02, -7.3030e-02, -3.0569e-02,  5.2222e-02, -2.9443e-02,\n",
       "          -2.7357e-02, -3.7027e-02,  4.7667e-02,  2.8767e-02, -1.8463e-02,\n",
       "          -9.6530e-02,  1.8173e-03,  8.2421e-02,  1.1538e-02,  7.5925e-02,\n",
       "           5.0958e-02, -3.0782e-02,  6.4829e-02,  3.4243e-02, -2.8340e-02,\n",
       "          -7.1094e-02,  1.0888e-02,  7.0508e-02,  2.4682e-02,  1.7071e-02,\n",
       "           4.9648e-02,  2.6744e-02,  3.0159e-02,  1.4078e-02, -9.1876e-02,\n",
       "          -9.9352e-02, -8.9208e-02,  3.9369e-02,  4.5401e-02, -9.1201e-02,\n",
       "          -4.5734e-02,  4.9756e-02, -3.3441e-02, -8.6622e-02,  4.5428e-02,\n",
       "           4.5607e-02,  7.4965e-02, -6.9828e-02,  7.8734e-02, -9.6819e-02,\n",
       "          -1.2470e-02, -4.2651e-02,  2.5724e-02, -1.4453e-02, -3.4666e-02,\n",
       "           1.7404e-02, -6.8087e-02,  2.9591e-02,  5.5797e-02, -5.0103e-02,\n",
       "          -6.8399e-02,  7.1425e-02, -6.3950e-02, -7.1578e-02,  3.1074e-02,\n",
       "           3.9344e-02, -4.3450e-02, -6.8727e-02,  6.5202e-04,  4.9915e-02,\n",
       "           9.9455e-03,  5.6439e-02,  9.2917e-02, -3.8741e-02,  6.0789e-03,\n",
       "          -1.6716e-02, -2.9523e-03,  6.6128e-02,  4.4599e-03, -2.0201e-02,\n",
       "          -7.3051e-02, -4.0550e-02,  2.9033e-02,  4.4989e-02, -9.5557e-02],\n",
       "         [ 3.5366e-02, -5.9760e-02,  5.6183e-02, -6.2630e-02,  1.8399e-02,\n",
       "           7.2295e-02,  9.3324e-02,  8.4657e-02, -5.4496e-02, -6.8950e-02,\n",
       "          -3.5282e-03,  6.7815e-02, -8.8862e-02, -3.2434e-02, -5.4758e-02,\n",
       "           3.8357e-02,  1.1405e-02,  3.3626e-02,  4.9721e-03,  4.2795e-02,\n",
       "           3.7682e-02,  8.5545e-02, -3.5452e-02,  5.6781e-02, -1.4503e-02,\n",
       "           2.2431e-03,  1.1675e-02, -7.8778e-02, -4.3918e-03, -2.9619e-02,\n",
       "          -5.6663e-02,  4.5064e-02, -7.6134e-02, -4.0792e-02,  3.4787e-02,\n",
       "          -6.5255e-02, -5.6142e-02,  2.1624e-02, -4.6346e-02,  3.7610e-03,\n",
       "          -9.6882e-02,  9.2151e-02,  5.1565e-02,  5.9557e-02,  9.9398e-03,\n",
       "          -4.1516e-02, -9.7942e-02, -4.6927e-02, -6.4535e-02,  6.4615e-02,\n",
       "          -3.6941e-03, -5.5321e-02, -5.4081e-02, -6.6755e-02, -6.7895e-02,\n",
       "          -6.6750e-02,  4.4024e-02, -8.4754e-02,  3.5650e-02, -1.0383e-02,\n",
       "           9.3871e-02,  1.9894e-02, -7.7135e-02,  7.3494e-02, -2.2449e-02,\n",
       "          -4.3258e-02,  8.1249e-02, -6.8665e-02,  5.3099e-02,  2.6850e-02,\n",
       "           7.7843e-02,  2.8193e-02, -6.6309e-02,  5.1433e-02, -7.3551e-02,\n",
       "          -5.2354e-02,  3.1918e-02,  3.6017e-02, -2.0968e-02,  4.6328e-02,\n",
       "           5.9722e-02, -8.6720e-02,  3.7632e-02, -2.5551e-02, -8.4039e-02,\n",
       "           4.1341e-03, -5.7021e-03,  5.5086e-02,  6.7135e-02, -3.5604e-02,\n",
       "           8.4486e-02,  2.6809e-02, -7.1105e-02, -9.0639e-02,  7.7159e-02,\n",
       "           8.1972e-02, -7.4022e-02,  1.8558e-03, -9.0657e-02, -5.1890e-02],\n",
       "         [ 7.2053e-02, -7.5840e-02,  2.0758e-02,  3.1559e-02, -1.2348e-02,\n",
       "          -3.4821e-02,  2.8375e-02,  7.4721e-02, -1.8476e-02,  9.4767e-02,\n",
       "           3.9869e-02,  5.2690e-02, -9.4418e-02, -9.0235e-02, -2.6238e-02,\n",
       "          -3.8576e-03,  5.3013e-02,  3.8141e-02, -1.1927e-02, -2.3032e-02,\n",
       "          -9.2038e-02,  5.5399e-03, -8.5389e-02,  6.6495e-02,  3.2337e-02,\n",
       "          -6.8429e-02, -9.6590e-02, -4.9163e-02,  4.3336e-02, -3.6716e-02,\n",
       "           2.5037e-02,  8.1501e-02, -8.2004e-02, -9.4792e-02,  9.1163e-02,\n",
       "           5.3382e-02, -9.5083e-02, -4.3362e-02,  9.1429e-02, -1.3502e-02,\n",
       "           7.2166e-02, -2.8070e-02,  3.7252e-02,  3.0453e-02,  7.7790e-02,\n",
       "           7.8395e-05,  4.3976e-03,  7.5564e-02, -2.1955e-02,  9.9096e-02,\n",
       "           4.9776e-02,  9.3474e-03, -5.1889e-02,  6.4003e-02, -8.4911e-02,\n",
       "          -7.9001e-02, -9.5380e-02,  3.9706e-02,  2.4027e-02,  8.6642e-02,\n",
       "          -2.8140e-02,  2.8792e-02,  8.7430e-02,  1.2570e-02, -6.0728e-02,\n",
       "           4.9787e-02,  1.7846e-02,  5.7911e-02,  7.3738e-03,  7.6171e-02,\n",
       "          -6.6782e-02, -4.1389e-02, -7.0980e-02, -7.9920e-02,  1.6603e-02,\n",
       "          -4.7329e-02, -3.3814e-02,  3.2494e-02, -6.3741e-02,  8.7524e-02,\n",
       "           2.5323e-02,  9.9564e-02, -5.6728e-02, -9.0215e-02, -8.1408e-03,\n",
       "           1.4292e-02, -9.2733e-02, -4.5696e-02,  4.9745e-02, -5.2697e-02,\n",
       "          -2.5027e-02, -8.5410e-02,  8.7130e-02,  7.9842e-02, -2.1585e-02,\n",
       "           8.9646e-02, -1.4594e-02,  5.8447e-02,  3.3479e-03,  7.3237e-02],\n",
       "         [-1.8594e-02,  5.6947e-02, -6.3029e-02, -8.1378e-02,  2.3342e-02,\n",
       "           7.4073e-02,  8.3822e-02,  6.2425e-02, -5.6932e-02,  7.7953e-02,\n",
       "           6.5147e-02, -6.9290e-02,  2.5851e-02, -9.3716e-02, -9.5130e-02,\n",
       "           1.3459e-02,  9.8552e-02,  7.9442e-02,  2.6661e-02,  2.5783e-02,\n",
       "          -8.4606e-02,  4.7644e-02, -9.5033e-02,  3.9690e-02,  1.5262e-02,\n",
       "          -8.6288e-02, -5.9066e-02,  9.8574e-02, -8.3427e-02,  7.6062e-02,\n",
       "          -1.8111e-02,  4.4051e-02, -7.8050e-02, -4.3160e-02,  4.9853e-02,\n",
       "           4.9329e-02,  3.9791e-02,  9.2014e-02,  2.1805e-02,  5.6917e-02,\n",
       "           2.0237e-02, -5.7515e-03,  7.1746e-02,  8.8632e-02, -6.6872e-02,\n",
       "          -8.9072e-02,  4.2132e-02, -1.5737e-02, -9.2601e-03,  3.6553e-02,\n",
       "           4.1099e-02,  8.3195e-02,  4.6385e-02, -4.3131e-02,  2.4610e-03,\n",
       "          -4.4239e-02, -3.7431e-02, -5.0802e-02,  7.3193e-02,  8.1622e-02,\n",
       "          -4.5208e-02, -5.5909e-04,  5.4205e-02, -8.4752e-02, -2.4554e-02,\n",
       "           5.8998e-02,  8.5942e-02, -1.2201e-02, -9.5768e-03, -3.6379e-02,\n",
       "          -2.9899e-02, -6.9811e-02, -9.3091e-03,  7.5982e-02,  6.8844e-02,\n",
       "           6.2917e-02, -2.1852e-02,  9.7871e-03,  4.4693e-02, -8.4044e-02,\n",
       "          -3.7938e-02, -3.8257e-02, -1.4773e-02,  5.3520e-02,  5.6198e-02,\n",
       "           9.9086e-02,  7.8069e-02,  9.6372e-02, -9.6438e-02, -7.8871e-02,\n",
       "          -6.2168e-02, -7.3031e-02,  5.0833e-02,  9.5496e-02,  2.1386e-02,\n",
       "          -1.8415e-02,  1.9010e-02,  3.4210e-02, -8.6537e-02, -3.3194e-02],\n",
       "         [ 3.4495e-02, -3.0045e-02,  3.9966e-02,  6.7063e-03, -7.0672e-02,\n",
       "           6.4516e-02, -8.2795e-02,  2.9684e-03,  5.9511e-02, -3.5937e-02,\n",
       "          -1.7603e-03,  5.3186e-03,  6.8785e-02,  4.3409e-02,  7.4386e-03,\n",
       "          -7.3362e-02,  2.1300e-03,  9.7115e-02,  4.3300e-02,  9.6695e-03,\n",
       "           6.6859e-02,  2.7373e-02, -7.9511e-02, -5.4767e-02,  3.0557e-02,\n",
       "           5.0278e-02, -6.2894e-02, -3.1595e-02, -1.2364e-02, -3.6015e-02,\n",
       "           9.9743e-02,  4.1375e-02,  8.0906e-02, -4.1087e-02, -7.7201e-02,\n",
       "           9.4771e-02, -2.9126e-03, -5.5578e-02, -9.7629e-02,  6.3405e-03,\n",
       "           3.9810e-02,  9.0553e-02,  8.0877e-02, -1.6444e-02,  9.4779e-02,\n",
       "           2.2839e-02, -9.7604e-02,  7.5854e-02,  8.5993e-02,  2.1324e-02,\n",
       "           3.4921e-02, -5.9706e-02,  6.0138e-02,  7.5994e-02,  4.4100e-02,\n",
       "          -1.4322e-02,  5.8208e-02, -7.8522e-02,  6.8662e-02, -2.4463e-02,\n",
       "           6.1458e-02,  4.2963e-02, -1.7491e-02, -7.8481e-02,  4.8113e-02,\n",
       "          -1.6365e-02, -5.6649e-02, -6.0279e-02,  3.7501e-02, -3.2004e-02,\n",
       "          -9.2343e-02, -9.8023e-02,  8.3725e-02,  2.8756e-02, -3.9444e-02,\n",
       "          -8.7585e-02, -8.9765e-03,  7.0555e-02,  4.5800e-04,  7.2561e-02,\n",
       "          -1.0489e-03,  4.8341e-02, -2.8097e-02,  6.1049e-03, -8.1148e-02,\n",
       "          -9.3395e-02,  4.9573e-02, -6.6468e-02,  4.0167e-02, -2.8376e-02,\n",
       "          -5.4912e-02,  7.0453e-03, -2.2227e-02, -4.7217e-02, -5.7973e-03,\n",
       "           9.0576e-02,  8.4090e-02, -9.2579e-02, -1.8748e-02, -5.8170e-02],\n",
       "         [ 5.0860e-02,  3.7891e-02,  3.1395e-02, -2.1631e-02, -5.3587e-02,\n",
       "          -4.9313e-02,  7.2764e-02,  6.6093e-03,  4.8214e-02, -2.8584e-02,\n",
       "           9.9029e-02, -9.1894e-02,  2.0624e-02,  9.1287e-02,  4.9057e-03,\n",
       "           6.7612e-02, -7.4775e-02, -7.6778e-02, -3.1776e-02,  4.8964e-02,\n",
       "          -7.0906e-02,  7.4174e-02,  4.6019e-02, -2.8400e-02, -7.9681e-02,\n",
       "           8.0998e-02, -2.8583e-02, -4.7751e-02, -8.6717e-02,  3.2226e-02,\n",
       "          -5.4954e-02, -9.7574e-02,  6.2308e-02,  1.9128e-03,  2.5333e-02,\n",
       "          -4.6248e-02,  9.5026e-03,  4.0450e-03,  3.1652e-02,  5.3766e-02,\n",
       "          -3.8201e-02, -8.0041e-02, -7.2097e-02, -9.1089e-02, -5.8314e-02,\n",
       "          -5.2985e-02,  1.2010e-02,  5.7611e-02,  3.5053e-02, -1.7864e-02,\n",
       "          -4.7320e-02, -6.8422e-02,  7.1572e-02, -6.3600e-02,  4.3670e-02,\n",
       "           7.1196e-02,  1.6374e-02, -8.6031e-02, -2.8653e-02,  1.2602e-02,\n",
       "           1.0245e-02,  7.0314e-02,  4.4964e-02, -7.0270e-02, -5.7819e-03,\n",
       "          -3.4233e-02, -9.4456e-02, -1.1000e-02,  4.2861e-02,  6.3441e-02,\n",
       "          -5.0952e-02, -4.2732e-02,  8.2887e-02, -7.7838e-02,  7.3102e-02,\n",
       "           1.1906e-02,  2.8941e-02,  4.6943e-02,  6.3804e-02,  9.3582e-02,\n",
       "           9.3594e-02, -6.2176e-02, -8.5159e-02, -1.0384e-02, -1.9700e-02,\n",
       "           3.3667e-02, -3.2761e-02, -9.1178e-02, -8.8474e-02, -5.5240e-02,\n",
       "          -2.2951e-02,  5.4669e-02, -4.2493e-02,  4.9873e-02, -9.8158e-02,\n",
       "           1.0453e-02, -8.3397e-02, -4.4602e-02, -2.7594e-02,  6.7546e-02],\n",
       "         [ 4.1121e-02,  7.3887e-02,  7.5129e-02, -8.8769e-02,  5.0799e-02,\n",
       "          -2.0326e-03,  6.6551e-03,  7.8794e-02,  3.0217e-03,  4.9504e-02,\n",
       "           9.2345e-03, -4.6400e-02,  1.1117e-02,  9.1071e-02, -8.3182e-02,\n",
       "           9.2977e-02, -9.3860e-03, -3.4192e-02, -1.9214e-02,  6.4988e-02,\n",
       "          -8.6360e-02, -6.4895e-02,  8.0386e-02,  2.4035e-02,  6.2740e-02,\n",
       "          -6.4745e-02,  9.5365e-02,  3.7349e-02,  4.9234e-02,  7.5246e-02,\n",
       "           3.4903e-02,  3.2065e-02, -2.0194e-02,  9.4935e-02, -3.9658e-03,\n",
       "           2.7343e-02,  8.6110e-02,  6.0614e-02,  5.2041e-02, -6.1314e-02,\n",
       "           7.6619e-03, -4.1294e-02,  6.2047e-02, -3.6248e-02, -2.4126e-02,\n",
       "          -2.2169e-02,  2.9890e-03, -7.1930e-02,  6.8268e-02,  3.7637e-02,\n",
       "          -7.7928e-02,  8.1305e-02,  6.4674e-02,  1.4466e-02, -5.3643e-02,\n",
       "          -7.7942e-02,  5.7419e-02,  7.4141e-03,  5.8418e-02,  9.0942e-02,\n",
       "           8.1738e-02, -7.0750e-02, -7.1464e-02,  3.9463e-03,  7.8828e-02,\n",
       "          -2.2105e-03,  3.5187e-02,  1.6159e-02,  6.5070e-02, -2.7360e-03,\n",
       "           2.6979e-02, -2.0854e-03, -2.6409e-03, -3.6256e-02,  6.7817e-03,\n",
       "          -4.1096e-02,  2.4708e-02, -2.0544e-02, -4.4365e-02, -9.9135e-02,\n",
       "           1.9015e-02, -9.5966e-02, -1.5397e-02, -1.1021e-02, -6.6675e-02,\n",
       "           6.1860e-02, -2.7886e-02, -2.1138e-03, -5.4279e-02, -2.9542e-02,\n",
       "          -2.3400e-02,  8.3496e-02, -7.3369e-02, -6.3358e-02, -1.2220e-02,\n",
       "          -7.4605e-02, -2.3980e-02, -7.1163e-02, -7.4129e-02, -4.0885e-02]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0649,  0.0322, -0.0797,  0.0333,  0.0882, -0.0747,  0.0543,  0.0849,\n",
       "          0.0088,  0.0236], requires_grad=True)]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:34.677508500Z",
     "start_time": "2024-07-17T03:06:34.619793100Z"
    }
   },
   "outputs": [],
   "source": [
    "# model.state_dict()  # 这种方法用于保存模型参数，看能看见参数属于模型的哪一部分"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T09:03:23.663804Z",
     "start_time": "2025-02-25T09:03:23.660903Z"
    }
   },
   "source": [
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss() #内部先做softmax，然后计算交叉熵\n",
    "# 2. 定义优化器 采用SGD\n",
    "# Optimizers specified in the torch.optim package,随机梯度下降\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)"
   ],
   "outputs": [],
   "execution_count": 10
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T09:03:26.810571Z",
     "start_time": "2025-02-25T09:03:26.404969Z"
    }
   },
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "@torch.no_grad() # 装饰器，禁止反向传播，节省内存\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = [] # 记录损失\n",
    "    pred_list = [] # 记录预测\n",
    "    label_list = [] # 记录标签\n",
    "    for datas, labels in dataloader:#10000/32=312\n",
    "        datas = datas.to(device) # 转到GPU\n",
    "        labels = labels.to(device) # 转到GPU\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)         # 验证集损失\n",
    "        loss_list.append(loss.item()) # 记录损失\n",
    "        \n",
    "        preds = logits.argmax(axis=-1)    # 验证集预测,argmax返回最大值索引\n",
    "        # print(preds)\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())#将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
    "        # print(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "        \n",
    "    acc = accuracy_score(label_list, pred_list) # 计算准确率\n",
    "    return np.mean(loss_list), acc\n"
   ],
   "outputs": [],
   "execution_count": 11
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "outputs": [
    {
     "data": {
      "text/plain": "37500"
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1875*20"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-17T03:06:35.201490200Z",
     "start_time": "2024-07-17T03:06:35.194584600Z"
    }
   }
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T09:07:49.480557Z",
     "start_time": "2025-02-25T09:03:31.216881Z"
    }
   },
   "source": [
    "# 训练\n",
    "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "    \n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar: # 进度条 1875*20,60000/32=1875\n",
    "        for epoch_id in range(epoch): # 训练epoch次\n",
    "            # training\n",
    "            for datas, labels in train_loader: #执行次数是60000/32=1875\n",
    "                datas = datas.to(device) #datas尺寸是[batch_size,1,28,28]\n",
    "                labels = labels.to(device) #labels尺寸是[batch_size]\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传，loss.backward()会计算梯度，loss对模型参数求导\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
    "                optimizer.step() #梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
    "\n",
    "                preds = logits.argmax(axis=-1) # 训练集预测\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())   # 计算准确率，numpy可以\n",
    "                loss = loss.cpu().item() # 损失转到CPU，item()取值,一个数值\n",
    "                # record\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                }) # 记录训练集信息，每一步的损失，准确率，步数\n",
    "                \n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval() # 进入评估模式\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train() # 进入训练模式\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1 # 全局步数加1\n",
    "                pbar.update(1) # 更新进度条\n",
    "                pbar.set_postfix({\"epoch\": epoch_id}) # 设置进度条显示信息\n",
    "        \n",
    "    return record_dict\n",
    "        \n",
    "\n",
    "epoch = 20 #改为40\n",
    "model = model.to(device)\n",
    "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/37500 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "5d8b09b8e9794d0bafb6b4e4a5e52420"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 12
  },
  {
   "cell_type": "code",
   "source": [
    "record[\"train\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T09:08:28.051819Z",
     "start_time": "2025-02-25T09:08:28.047245Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.21292752027511597, 'acc': 0.9375, 'step': 37495},\n",
       " {'loss': 0.29980722069740295, 'acc': 0.90625, 'step': 37496},\n",
       " {'loss': 0.2991344630718231, 'acc': 0.875, 'step': 37497},\n",
       " {'loss': 0.27740970253944397, 'acc': 0.875, 'step': 37498},\n",
       " {'loss': 0.2908701002597809, 'acc': 0.875, 'step': 37499}]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 13
  },
  {
   "cell_type": "code",
   "source": [
    "record[\"val\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-02-25T09:08:29.757794Z",
     "start_time": "2025-02-25T09:08:29.752782Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': np.float64(0.3711889322144917), 'acc': 0.8673, 'step': 33000},\n",
       " {'loss': np.float64(0.36389951451946373), 'acc': 0.8702, 'step': 34000},\n",
       " {'loss': np.float64(0.36929454402135203), 'acc': 0.8667, 'step': 35000},\n",
       " {'loss': np.float64(0.36489807616788356), 'acc': 0.8676, 'step': 36000},\n",
       " {'loss': np.float64(0.35617960149202105), 'acc': 0.8712, 'step': 37000}]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 14
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T09:27:52.675774Z",
     "start_time": "2025-02-25T09:27:52.522081Z"
    }
   },
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=1000):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    last_step = train_df.index[-1] # 最后一步的步数\n",
    "    # print(train_df.columns)\n",
    "    print(train_df['acc'])\n",
    "    print(val_df['acc'])\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns) # 画几张图,分别是损失和准确率\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        # print(train_df[item].values)\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid() # 显示网格\n",
    "        axs[idx].legend() # 显示图例\n",
    "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000)) # 设置x轴刻度\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, last_step, 5000))) # 设置x轴标签\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "    \n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(record)  #横坐标是 steps"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step\n",
      "0        0.21875\n",
      "1000     0.71875\n",
      "2000     0.68750\n",
      "3000     0.81250\n",
      "4000     0.87500\n",
      "5000     0.71875\n",
      "6000     0.87500\n",
      "7000     0.75000\n",
      "8000     0.87500\n",
      "9000     0.81250\n",
      "10000    0.81250\n",
      "11000    0.87500\n",
      "12000    0.78125\n",
      "13000    0.71875\n",
      "14000    0.84375\n",
      "15000    0.93750\n",
      "16000    0.81250\n",
      "17000    0.81250\n",
      "18000    0.90625\n",
      "19000    0.90625\n",
      "20000    0.96875\n",
      "21000    0.93750\n",
      "22000    0.90625\n",
      "23000    0.81250\n",
      "24000    0.84375\n",
      "25000    0.84375\n",
      "26000    0.96875\n",
      "27000    0.90625\n",
      "28000    0.93750\n",
      "29000    0.81250\n",
      "30000    0.84375\n",
      "31000    0.96875\n",
      "32000    0.96875\n",
      "33000    0.81250\n",
      "34000    0.84375\n",
      "35000    0.96875\n",
      "36000    0.93750\n",
      "37000    0.87500\n",
      "Name: acc, dtype: float64\n",
      "step\n",
      "0        0.1313\n",
      "1000     0.6768\n",
      "2000     0.7564\n",
      "3000     0.7972\n",
      "4000     0.7978\n",
      "5000     0.8115\n",
      "6000     0.8218\n",
      "7000     0.8271\n",
      "8000     0.8321\n",
      "9000     0.8339\n",
      "10000    0.8350\n",
      "11000    0.8404\n",
      "12000    0.8401\n",
      "13000    0.8424\n",
      "14000    0.8455\n",
      "15000    0.8523\n",
      "16000    0.8533\n",
      "17000    0.8545\n",
      "18000    0.8494\n",
      "19000    0.8573\n",
      "20000    0.8555\n",
      "21000    0.8553\n",
      "22000    0.8638\n",
      "23000    0.8631\n",
      "24000    0.8632\n",
      "25000    0.8625\n",
      "26000    0.8658\n",
      "27000    0.8675\n",
      "28000    0.8655\n",
      "29000    0.8694\n",
      "30000    0.8709\n",
      "31000    0.8643\n",
      "32000    0.8705\n",
      "33000    0.8673\n",
      "34000    0.8702\n",
      "35000    0.8667\n",
      "36000    0.8676\n",
      "37000    0.8712\n",
      "Name: acc, dtype: float64\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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IyNDZUtk4TVx4kTv/R9++GG89957+N///qcESVd4/fXXUV9frxaHcgRbePrpp9VC8bHHHlOipaKiAhdddBGGDh2qbh85ciQqKyvVecns3HPPPRg1apS6PHz48C7FQ0hL+4cIGfmu6kLHd/8QoXP66aer/SQQ+8cdd9zRyMTgd7/7HW699Vav0JFszbRp07yXhbFjx6rTqqoqJX5kH7rxxhvVdbLfiOBpmpEK54zO5Nxe2FvublRWFcqyNemnCETZmi+/vHA0PttTjGOn6vDYsj146NJxCKURgZgNtOS45ou8fxE6K3efVBmNJ1bsxaGSGmSlWPDrhWOa3X9YVrISOvI3DITQkb9FZ8rFfMvXlNApqw1cX1NmUoeFigjC+BitfG3bsQpM9Bg3dCdRIXQMHqFjZOkaIcHBHA/XL495F0DdSoxWj+wvctRaFliSGZGj0q+99hq+853vqNhlIffAAw9gyZIl6uiwHLmqq6vzlo91hd27dysRpYscQRaNsiiTI+JnnXUWvve976msj4gwEWRXXnml9/533XWXygD985//VLfJ+9AFEYkA5HsqmRUP8nevrKpCSnJy8PebDuwjkjmUrKKIi5b2DxE3kv0MxP4hZW+LFi1SWRgR9PJ8cjCgtrZWlapJRke+563tT1ar1SvIIglxV9P7OSblpqIyT7teFoMynyVUGQ8pzZKsh5Q9nT40I2DPm2Qxq0Gi173wNV5dd0RZVnfGza2r5HkW7CM85gFtIQJUz9I8+ck+JXr0kjUp62uKiABxlwuUxfSxU7WwOlyqhyvX03PTEfTH5AdC6Oh9TZ3IDImgPG90psroSPlaKIROVPToGGK1P7jJSaFDSFCQozxSGhOKrYNHmC644ALlACNi5ujRo/j888/V4k64++671RFqKc2R62WhJT0EUkbWHbz00ktYt24dZs+ejbfeektlb6TMTRABtnPnTixcuBCffvopxowZo2IlEbyPiAAJs31EMoyt7R+//e1vlV16IPaPw4cPq+zlhAkT8J///AcbN27EM888o27Tn0962VqjrdvCnW1Hy1UpkPSBZKXEITEGSPcMYQxln47eRzFvbDZizYFdHp4+LAPXzNDKG6WErdbW/VbaesbMnz4TVb7mMSX4++qDqmTtiin9cd4ozTK5KSM8z6lnPwIlLjrquBaMWTr7fTI6nUHK14SlOwpC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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 15
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-02-25T09:29:30.505260Z",
     "start_time": "2025-02-25T09:29:29.127337Z"
    }
   },
   "source": [
    "model.eval() # 进入评估模式\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3564\n",
      "accuracy: 0.8696\n"
     ]
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": ""
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
